support third party library configuration in qmake (#611)
authortsteven4 <13596209+tsteven4@users.noreply.github.com>
Mon, 27 Jul 2020 21:25:22 +0000 (15:25 -0600)
committerGitHub <noreply@github.com>
Mon, 27 Jul 2020 21:25:22 +0000 (15:25 -0600)
* add qmake options to specify libraries.

* fix no libusb along lines of #610

* correct inclusion of shapelib headers.

* more closely match original includes

instead of trying to use HAVE_*, ENABLED_* *_INHIBITED and
-I options in a consistent manner.

We can revisit this after the demise of configure.

* add qmake message when libusb is disabled.

GPSBabel.pro
jeeps/gpslibusb.cc
jeeps/gpsusbstub.cc
libusb.pri [new file with mode: 0644]
shape.cc
shape.h
shapelib.pri [new file with mode: 0644]
zlib.pri [new file with mode: 0644]

index 3e1ca1573f587fa518db93189fe5c60a47f3d626..9444222061b59126faaa5816cb227dbd6d5709de 100644 (file)
@@ -10,7 +10,7 @@ count(MIN_QT_VERSION_PATCH, 0): MIN_QT_VERSION_PATCH = 0
 lessThan(QT_MAJOR_VERSION, $$MIN_QT_VERSION_MAJOR) | \
 if(equals(QT_MAJOR_VERSION, $$MIN_QT_VERSION_MAJOR):lessThan(QT_MINOR_VERSION, $$MIN_QT_VERSION_MINOR)) | \
 if(equals(QT_MAJOR_VERSION, $$MIN_QT_VERSION_MAJOR):equals(QT_MINOR_VERSION, $$MIN_QT_VERSION_MINOR):lessThan(QT_PATCH_VERSION, $$MIN_QT_VERSION_PATCH)) {
-  error("$$QMAKE_QMAKE uses Qt version $$QT_VERSION but version $${MIN_QT_VERSION_MAJOR}.$${MIN_QT_VERSION_MINOR}.$${MIN_QT_VERSION_PATCH} or newer is required.")  
+  error("$$QMAKE_QMAKE uses Qt version $$QT_VERSION but version $${MIN_QT_VERSION_MAJOR}.$${MIN_QT_VERSION_MINOR}.$${MIN_QT_VERSION_PATCH} or newer is required.")
 }
 
 QT -= gui
@@ -20,6 +20,7 @@ TARGET = gpsbabel
 CONFIG += console
 CONFIG -= app_bundle
 CONFIG += c++14
+CONFIG += link_pkgconfig
 
 TEMPLATE = app
 
@@ -61,13 +62,6 @@ FILTERS=position.cc radius.cc duplicate.cc arcdist.cc polygon.cc smplrout.cc \
 FILTER_HEADERS = $$FILTERS
 FILTER_HEADERS ~= s/\.cc/.h/g
 
-SHAPE=shapelib/shpopen.c shapelib/dbfopen.c shapelib/safileio.c
-
-ZLIB=zlib/adler32.c zlib/compress.c zlib/crc32.c zlib/deflate.c zlib/inffast.c \
-        zlib/inflate.c zlib/infback.c zlib/inftrees.c zlib/trees.c \
-        zlib/uncompr.c zlib/gzlib.c zlib/gzclose.c zlib/gzread.c \
-        zlib/gzwrite.c zlib/zutil.c
-
 JEEPS += jeeps/gpsapp.cc jeeps/gpscom.cc \
          jeeps/gpsmath.cc jeeps/gpsmem.cc  \
          jeeps/gpsprot.cc jeeps/gpsread.cc \
@@ -84,7 +78,7 @@ SUPPORT = route.cc waypt.cc filter_vecs.cc util.cc vecs.cc mkshort.cc \
           gbfile.cc parse.cc session.cc main.cc globals.cc \
           src/core/textstream.cc \
           src/core/usasciicodec.cc \
-          src/core/xmlstreamwriter.cc 
+          src/core/xmlstreamwriter.cc
 
 HEADERS =  \
        an1sym.h \
@@ -147,7 +141,6 @@ HEADERS =  \
        random.h \
        session.h \
        shape.h \
-       shapelib/shapefil.h \
        strptime.h \
        subrip.h \
        unicsv.h \
@@ -156,17 +149,6 @@ HEADERS =  \
        xcsv.h \
        xmlgeneric.h \
        yahoo.h \
-       zlib/crc32.h \
-       zlib/deflate.h \
-       zlib/gzguts.h \
-       zlib/inffast.h \
-       zlib/inffixed.h \
-       zlib/inflate.h \
-       zlib/inftrees.h \
-       zlib/trees.h \
-       zlib/zconf.h \
-       zlib/zlib.h \
-       zlib/zutil.h \
        src/core/datetime.h \
        src/core/file.h \
        src/core/logging.h \
@@ -178,8 +160,6 @@ HEADERS =  \
 
 HEADERS += $$FILTER_HEADERS
 
-INCLUDEPATH += zlib
-
 load(configure)
 
 CONFIG(release, debug|release): DEFINES *= NDEBUG
@@ -193,23 +173,21 @@ macx|linux|openbsd {
     # this is used by zlib
     DEFINES += HAVE_STDARG_H
   }
-  DEFINES += HAVE_LIBUSB_1_0
   SOURCES += gbser_posix.cc
   HEADERS += gbser_posix.h
-  JEEPS += jeeps/gpslibusb.cc
   INCLUDEPATH += jeeps
 }
 
 win32 {
   DEFINES += __WIN32__ _CONSOLE
-  DEFINES -= UNICODE ZLIB_INHIBITED
+  DEFINES -= UNICODE
   CONFIG(debug, debug|release) {
     DEFINES += _DEBUG
   }
   SOURCES += gbser_win.cc
   HEADERS += gbser_win.h
   JEEPS += jeeps/gpsusbwin.cc
-  LIBS += "-lsetupapi" 
+  LIBS += "-lsetupapi"
   RC_FILE = win32/gpsbabel.rc
 }
 
@@ -218,39 +196,15 @@ win32-msvc* {
   QMAKE_CXXFLAGS += /MP -wd4100
 }
 
-linux|openbsd {
-  LIBS += "-lusb-1.0"
-}
-
-macx {
-  LIBS += -lobjc -framework IOKit -framework CoreFoundation
-  INCLUDEPATH += mac/libusb \
-                 mac/libusb/Xcode
-  SOURCES += mac/libusb/core.c \
-             mac/libusb/descriptor.c \
-             mac/libusb/hotplug.c \
-             mac/libusb/io.c \
-             mac/libusb/strerror.c \
-             mac/libusb/sync.c \
-             mac/libusb/os/darwin_usb.c \
-             mac/libusb/os/poll_posix.c \
-             mac/libusb/os/threads_posix.c
-  HEADERS += mac/libusb/hotplug.h \
-             mac/libusb/libusb.h \
-             mac/libusb/libusbi.h \
-             mac/libusb/version.h \
-             mac/libusb/version_nano.h \
-             mac/libusb/os/darwin_usb.h \
-             mac/libusb/os/poll_posix.h \
-             mac/libusb/os/threads_posix.h
-}
+include(shapelib.pri)
+include(zlib.pri)
+include(libusb.pri)
 
-SOURCES += $$ALL_FMTS $$FILTERS $$SUPPORT $$SHAPE $$ZLIB $$JEEPS
+SOURCES += $$ALL_FMTS $$FILTERS $$SUPPORT $$JEEPS
 
 # We don't care about stripping things out of the build.  Full monty, baby.
 DEFINES += MAXIMAL_ENABLED
 DEFINES += FILTERS_ENABLED
-DEFINES += SHAPELIB_ENABLED
 DEFINES += CSVFMTS_ENABLED
 
 # Creator insists on adding -W to -Wall which results in a completely
@@ -278,7 +232,7 @@ macx|linux|openbsd{
 # example usage:
 # make clang-tidy RUN_CLANG_TIDY_FLAGS="-header-filter=.*\\\.h -checks=-*,modernize-use-nullptr -fix"
 # It seems to be better to use run-clang-tidy with the compilation database as opposed to
-# running clang-tidy directly and listing the 
+# running clang-tidy directly and listing the
 # compilation options on the clang-tidy line after --.
 # An example is modernize-use-override which inserts repeadted overrides when run directly,
 # but works as expected when run with run-clang-tidy.
@@ -306,7 +260,7 @@ cppcheck.commands = cppcheck --enable=all --force --config-exclude=zlib --config
 QMAKE_EXTRA_TARGETS += cppcheck
 
 gpsbabel.pdf.depends = FORCE
-gpsbabel.pdf.commands += perl xmldoc/makedoc && 
+gpsbabel.pdf.commands += perl xmldoc/makedoc &&
 gpsbabel.pdf.commands += xmlwf xmldoc/readme.xml && #check for well-formedness
 gpsbabel.pdf.commands += xmllint --noout --valid xmldoc/readme.xml &&   #validate
 gpsbabel.pdf.commands += xsltproc -o gpsbabel.fo xmldoc/babelpdf.xsl xmldoc/readme.xml &&
index 3de96500311e0da2b84b40c84310438cc995e2da..bcdd8d141f2385fbc9816e919d8c986c6a38084f 100644 (file)
 #include "config.h"
 #endif
 #if HAVE_LIBUSB_1_0
+#ifdef LIBUSB_H_INCLUDE
+// Warning: LIBUSB_H_INCLUDE necessarily includes bracket or double quote
+//          characters.
+//          qmake -tp vc doesn't properly quote these characters, and the
+//          produced project file is invalid.  However, we don't use libusb
+//          at all on windows, so this isn't an issue in this application.
+#  include LIBUSB_H_INCLUDE
+#else  // TODO: delete this clause when configure is removed and CMakeLists updated.
 #  if __APPLE__
 // We use our own libusb.
 #    include "mac/libusb/libusb.h"
 #  else
 #    include <libusb-1.0/libusb.h>
 #  endif
+#endif
 #include "../defs.h"
 #include "garminusb.h"
 #include "gpsdevice.h"
index 9be709380c138c70bd4fa4b606b56c2055ad1677..8ffea63e91446f08ba16d4998ae8a4f99100db74 100644 (file)
@@ -25,7 +25,6 @@
 #endif
 
 #include "../defs.h"
-#include "src/core/logging.h"
 
 #if !HAVE_LIBUSB_1_0
 
diff --git a/libusb.pri b/libusb.pri
new file mode 100644 (file)
index 0000000..4779291
--- /dev/null
@@ -0,0 +1,65 @@
+macx|linux|openbsd {
+  !defined(WITH_LIBUSB, var) {
+    macx: WITH_LIBUSB = included
+    linux|openbsd: WITH_LIBUSB = system
+  }
+  equals(WITH_LIBUSB, no) {
+    message("libusb-1.0 disabled")
+    JEEPS += jeeps/gpsusbstub.cc
+  } else {
+    DEFINES += HAVE_LIBUSB_1_0
+    JEEPS += jeeps/gpslibusb.cc
+    equals(WITH_LIBUSB, pkgconfig) {
+      message("Using libusb-1.0 found by pkg-config")
+      PKGCONFIG += libusb-1.0
+      DEFINES += LIBUSB_H_INCLUDE=$$shell_quote(<libusb.h>)
+    } else {
+      linux|openbsd {
+        equals(WITH_LIBUSB, system) {
+          LIBS += "-lusb-1.0"
+          DEFINES += LIBUSB_H_INCLUDE=$$shell_quote(<libusb-1.0/libusb.h>)
+        } else:equals(WITH_LIBUSB, custom) {
+          message("libusb-1.0 is enabled but but must be manually configured")
+          message("  e.g. qmake WITH_LIBUSB=custom LIBS+=... INCLUDEPATH+=...")
+          DEFINES += LIBUSB_H_INCLUDE=$$shell_quote(<libusb.h>)
+        } else {
+          error("WITH_LIBUSB=no|pkgconfig|system*|custom");
+        }
+      }
+
+      macx {
+        equals(WITH_LIBUSB, included) {
+          # TODO: It would be better to create an archive and link to it
+          #       to separate library build requirements from gpsbabel requirements.
+          DEFINES += LIBUSB_H_INCLUDE=$$shell_quote(\"mac/libusb/libusb.h\")
+          LIBS += -lobjc -framework IOKit -framework CoreFoundation
+          INCLUDEPATH += mac/libusb \
+                         mac/libusb/Xcode
+          SOURCES += mac/libusb/core.c \
+                     mac/libusb/descriptor.c \
+                     mac/libusb/hotplug.c \
+                     mac/libusb/io.c \
+                     mac/libusb/strerror.c \
+                     mac/libusb/sync.c \
+                     mac/libusb/os/darwin_usb.c \
+                     mac/libusb/os/poll_posix.c \
+                     mac/libusb/os/threads_posix.c
+          HEADERS += mac/libusb/hotplug.h \
+                     mac/libusb/libusb.h \
+                     mac/libusb/libusbi.h \
+                     mac/libusb/version.h \
+                     mac/libusb/version_nano.h \
+                     mac/libusb/os/darwin_usb.h \
+                     mac/libusb/os/poll_posix.h \
+                     mac/libusb/os/threads_posix.h
+        } else:equals(WITH_LIBUSB, custom) {
+          message("libusb-1.0 is enabled but but must be manually configured")
+          message("  e.g. qmake WITH_LIBUSB=custom LIBS+=... INCLUDEPATH+=...")
+          DEFINES += LIBUSB_H_INCLUDE=$$shell_quote(<libusb.h>)
+        } else {
+          error("WITH_LIBUSB=no|pkgconfig|included*|custom");
+        }
+      }
+    }
+  }
+}
index 933eb95a4d0af282998331c3db1c41d856c29b97..139a7ee9dda1b8e08872586d86eabe767b5eb0aa 100644 (file)
--- a/shape.cc
+++ b/shape.cc
 
 #include "defs.h"
 #include "shape.h"
-#include "shapelib/shapefil.h"
+#if SHAPELIB_ENABLED
+#if HAVE_LIBSHAPE
+#  include <shapefil.h>
+#else
+#  include "shapelib/shapefil.h"
+#endif
 
 
-#if SHAPELIB_ENABLED
 #define MYNAME "shape"
 
 /************************************************************************/
diff --git a/shape.h b/shape.h
index 0ce05af7cdef6c3c7033e46a4fc61d7b0c43dfe0..38c1208c069d95933b534032b28c41b999fd3fc5 100644 (file)
--- a/shape.h
+++ b/shape.h
 
 #include "defs.h"               // for arglist_t, ARGTYPE_STRING, Waypoint, route_head, CET_CHARSET_ASCII, FF_CAP_RW_ALL, ff_cap, ff_type, ff_type_file
 #include "format.h"             // for Format
-#include "shapelib/shapefil.h"  // for DBFHandle, SHPAPI_CALL, SHPHandle
+#if SHAPELIB_ENABLED
+#if HAVE_LIBSHAPE
+#  include <shapefil.h>
+#else
+#  include "shapelib/shapefil.h"  // for DBFHandle, SHPAPI_CALL, SHPHandle
+#endif
 
 
-#if SHAPELIB_ENABLED
 class ShapeFormat : public Format
 {
 public:
diff --git a/shapelib.pri b/shapelib.pri
new file mode 100644 (file)
index 0000000..806c296
--- /dev/null
@@ -0,0 +1,22 @@
+!defined(WITH_SHAPELIB, var):WITH_SHAPELIB = included
+equals(WITH_SHAPELIB, no) {
+  message("shapelib disabled")
+} else {
+  DEFINES += SHAPELIB_ENABLED
+  equals(WITH_SHAPELIB, pkgconfig) {
+    message("Using shapelib found by pkg-config")
+    PKGCONFIG += shapelib
+    DEFINES += HAVE_LIBSHAPE
+  } else:equals(WITH_SHAPELIB, included) {
+    # TODO: It would be better to create an archive and link to it
+    #       to separate library build requirements from gpsbabel requirements.
+    SOURCES += shapelib/shpopen.c shapelib/dbfopen.c shapelib/safileio.c
+    HEADERS += shapelib/shapefil.h
+  } else:equals(WITH_SHAPELIB, custom) {
+    message("shapelib is enabled but but must be manually configured")
+    message("  e.g. qmake WITH_SHAPELIB=custom LIBS+=... INCLUDEPATH+=...")
+    DEFINES += HAVE_LIBSHAPE
+  } else {
+    error("WITH_SHAPELIB=no|pkgconfig|included*|custom");
+  }
+}
diff --git a/zlib.pri b/zlib.pri
new file mode 100644 (file)
index 0000000..36dcbb0
--- /dev/null
+++ b/zlib.pri
@@ -0,0 +1,47 @@
+!defined(WITH_ZLIB, var):WITH_ZLIB = included
+equals(WITH_ZLIB, no) {
+  message("zlib disabled")
+  DEFINES += ZLIB_INHIBITED
+} else {
+  equals(WITH_ZLIB, pkgconfig) {
+    message("Using zlib found by pkg-config")
+    PKGCONFIG += $$shell_quote(zlib > 1.2.8)
+    DEFINES += HAVE_LIBZ
+  } else:equals(WITH_ZLIB, included) {
+    # TODO: It would be better to create an archive and link to it
+    #       to separate library build requirements from gpsbabel requirements.
+    SOURCES += zlib/adler32.c \
+               zlib/compress.c \
+               zlib/crc32.c \
+               zlib/deflate.c \
+               zlib/inffast.c \
+               zlib/inflate.c \
+               zlib/infback.c \
+               zlib/inftrees.c \
+               zlib/trees.c \
+               zlib/uncompr.c \
+               zlib/gzlib.c \
+               zlib/gzclose.c \
+               zlib/gzread.c \
+               zlib/gzwrite.c \
+               zlib/zutil.c
+    INCLUDEPATH += zlib
+    HEADERS += zlib/crc32.h \
+               zlib/deflate.h \
+               zlib/gzguts.h \
+               zlib/inffast.h \
+               zlib/inffixed.h \
+               zlib/inflate.h \
+               zlib/inftrees.h \
+               zlib/trees.h \
+               zlib/zconf.h \
+               zlib/zlib.h \
+               zlib/zutil.h
+  } else:equals(WITH_ZLIB, custom) {
+    message("zlib is enabled but but must be manually configured")
+    message("  e.g. qmake WITH_ZLIB=custom LIBS+=... INCLUDEPATH+=...")
+    DEFINES += HAVE_LIBZ
+  } else {
+    error("WITH_ZLIB=no|pkgconfig|included*|custom");
+  }
+}